/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;

import DAO.util.ConectaBanco;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import model.Jogador;
import model.Time;

/**
 *
 * @author Alberto
 */
public class JogadorDAO {
    
    public boolean criar(Jogador jogador) {
        try {

            Connection conexao = ConectaBanco.getConexao();

            String sql = "insert into Jogador( id_time, nome_jogador, email_jogador, data_nasc_jogador,apelido,status)values (?,?,?,?,?,1)";

            PreparedStatement pstmt = conexao.prepareStatement(sql);

            pstmt.setInt(1, jogador.getTime().getId_time());
            pstmt.setString(2, jogador.getNome_jogador());
            pstmt.setString(3, jogador.getEmail_jogador());
            pstmt.setDate(4, jogador.getData_nasc_jogador());
            pstmt.setString(5,jogador.getApelido());

            pstmt.execute();
            conexao.close();

            return true;

        } catch (SQLException sql) {
            sql.printStackTrace();
            return false;

        }

    }

    public ArrayList<Jogador> buscarTodas(String nome, int id_time) {
        ArrayList<Jogador> jogadores = new ArrayList<Jogador>();
        Connection conexao = null;
        try {
            conexao = ConectaBanco.getConexao();
            String sql = "select * from Jogador where nome_jogador ilike ? and id_time = ? and status = 1";

            PreparedStatement pst = conexao.prepareStatement(sql);

            pst.setString(1, nome + "%");
            pst.setInt(2,id_time);
            ResultSet rs = pst.executeQuery();
            TimeDAO timeDAO = new TimeDAO();

            while (rs.next()) {
                Jogador jogador = new Jogador();
                jogador.setId_jogador(rs.getInt("id_jogador"));
                jogador.setTime(timeDAO.buscarPorId(rs.getInt("id_time")));
                jogador.setNome_jogador(rs.getString("nome_jogador"));
                jogador.setEmail_jogador(rs.getString("email_jogador"));
                jogador.setData_nasc_jogador(rs.getDate("data_nasc_jogador"));
                jogador.setApelido(rs.getString("apelido"));

                jogadores.add(jogador);
            }

            conexao.close();
            return jogadores;

        } catch (Exception sql) {
            System.out.println("Erro ao buscar um aluno" + sql.getMessage());
            return null;
        }

    }
    
    public ArrayList<Jogador> buscarPorTime(int idTime) {
        ArrayList<Jogador> jogadores = new ArrayList<Jogador>();
        Connection conexao = null;
        try {
            conexao = ConectaBanco.getConexao();
            String sql = "select * from Jogador where id_time= ?";

            PreparedStatement pst = conexao.prepareStatement(sql);

            pst.setInt(1, idTime);
            ResultSet rs = pst.executeQuery();
            TimeDAO timeDAO = new TimeDAO();

            while (rs.next()) {
                Jogador jogador = new Jogador();
                jogador.setId_jogador(rs.getInt("idJogador"));
                jogador.setTime(timeDAO.buscarPorId(rs.getInt("idTime")));
                jogador.setNome_jogador(rs.getString("nomeJogador"));
                jogador.setEmail_jogador(rs.getString("emailJogador"));
                jogador.setData_nasc_jogador(rs.getDate("dataNascJogador"));
                jogador.setApelido(rs.getString("apelido"));

                jogadores.add(jogador);
            }

            conexao.close();
            return jogadores;

        } catch (Exception sql) {
            System.out.println("Erro ao buscar um aluno" + sql.getMessage());
            return null;
        }

    }
    
        public ArrayList<Jogador> buscarPorId(int id) {
        ArrayList<Jogador> jogadores = new ArrayList<Jogador>();
        Connection conexao = null;
        try {
            conexao = ConectaBanco.getConexao();
            String sql = "select * from jogador where id_jogador= ?";

            PreparedStatement pst = conexao.prepareStatement(sql);

            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();
            TimeDAO timeDAO = new TimeDAO();

            while (rs.next()) {
                Jogador jogador = new Jogador();
                jogador.setId_jogador(rs.getInt("id_jogador"));
                jogador.setTime(timeDAO.buscarPorId(rs.getInt("id_time")));
                jogador.setNome_jogador(rs.getString("nome_jogador"));
                jogador.setEmail_jogador(rs.getString("email_jogador"));
                jogador.setData_nasc_jogador(rs.getDate("data_nasc_jogador"));
                jogador.setApelido(rs.getString("apelido"));
                System.out.println("data do jogador "+ jogador.getData_nasc_jogador());

                jogadores.add(jogador);
            }

            conexao.close();
            return jogadores;

        } catch (Exception sql) {
            System.out.println("Erro ao buscar um aluno" + sql.getMessage());
            return null;
        }

    }


    public boolean atualizar(Jogador jogador) {
        try {

            Connection conexao = ConectaBanco.getConexao();
            String sql = "update Jogador set  nome_jogador=?, email_jogador=?, data_nasc_jogador=? where id_jogador=?";
            PreparedStatement pstmt = conexao.prepareStatement(sql);

        
            pstmt.setString(1, jogador.getNome_jogador());
            pstmt.setString(2, jogador.getEmail_jogador());
            pstmt.setDate(3,jogador.getData_nasc_jogador());
            pstmt.setInt(4,jogador.getId_jogador());
        

            pstmt.execute();
            conexao.close();

            return true;
        } catch (SQLException sql) {
            return false;

        }
    }

    public boolean apagar(int num) {

        try {

            Connection conexao = ConectaBanco.getConexao();

            String sql = "delete from jogador where id_jogador = ?";
            PreparedStatement pstmt = conexao.prepareCall(sql);
            pstmt.setInt(1, num);

            pstmt.execute();

            conexao.close();
            return true;
        } catch (Exception ex) {
            return false;
        }

    }

    public boolean marcarInativo(int id) {
        try {
            Connection conexao = ConectaBanco.getConexao();

            String sql = "update jogador set status=0 where id_jogador=?";

            PreparedStatement pstmt = conexao.prepareCall(sql);

            pstmt.setInt(1, id);

            pstmt.execute();

            conexao.close();
            return true;
        } catch (SQLException sql) {

            return false;

        }
    }
    
    
    public int contarJogadores(Time time)throws Exception{
        int jogadores=0;
        
        Connection conexao = ConectaBanco.getConexao();
        
        String sql = "select count(id_jogador) as jogadores from jogador where id_time = ? and status=1";
        
        PreparedStatement pst = conexao.prepareCall(sql);
        pst.setInt(1, time.getId_time());
        ResultSet rs = pst.executeQuery();
        
        rs.next();
        jogadores = rs.getInt("jogadores");
        System.out.println("O número de jogadores é "+jogadores);    
        
        
        return jogadores;
    }

    public boolean marcarAtivo(int id) {
        try {
            Connection conexao = ConectaBanco.getConexao();

            String sql = "update Jogador set status=1 where id=?";

            PreparedStatement pstmt = conexao.prepareCall(sql);

            pstmt.setInt(1, id);

            pstmt.execute();

            conexao.close();
            return true;
        } catch (SQLException sql) {

            return false;

        }
    }
}
